// Copyright Epic Games, Inc. All Rights Reserved.

#pragma once

#include "Engine/LocalPlayer.h"
#include "GameplayTagContainer.h"
#include "Styling/CoreStyle.h"
#include "Styling/SlateBrush.h"
#include "Widgets/DeclarativeSyntaxSupport.h"
#include "Widgets/Accessibility/SlateWidgetAccessibleTypes.h"
#include "Widgets/SLeafWidget.h"

class FPaintArgs;
class FSlateRect;
class FSlateWindowElementList;
class FWidgetStyle;
struct FGameplayTag;
struct FGeometry;
struct FSlateBrush;

class SHitMarkerConfirmationWidget : public SLeafWidget
{
	SLATE_BEGIN_ARGS(SHitMarkerConfirmationWidget)
		: _PerHitMarkerImage(FCoreStyle::Get().GetBrush("Throbber.CircleChunk"))
		, _AnyHitsMarkerImage(nullptr)
		, _HitNotifyDuration(0.4f)
	{
	}
		/** 为单个命中标记绘制的标记图像 */
		SLATE_ARGUMENT(const FSlateBrush*, PerHitMarkerImage)
		/** 如果有任何命中，则绘制的标记图像 */
		SLATE_ARGUMENT(const FSlateBrush*, AnyHitsMarkerImage)
		/** 显示命中提示的持续时间（秒）（在此期间会逐渐变为透明） */
		SLATE_ATTRIBUTE(float, HitNotifyDuration)
		/** 标记的颜色和不透明度 */
		SLATE_ATTRIBUTE(FSlateColor, ColorAndOpacity)
	SLATE_END_ARGS()

public:
	/**
	 * 构建控件
	 * @param InArgs Slate参数
	 * @param InContext 本地玩家上下文
	 * @param ZoneOverrideImages 区域覆盖图像
	 */
	void Construct(const FArguments& InArgs, const FLocalPlayerContext& InContext, const TMap<FGameplayTag, FSlateBrush>& ZoneOverrideImages);

	SHitMarkerConfirmationWidget();

	//~SWidget 接口
	/**
	 * 绘制控件
	 * @param Args 绘制参数
	 * @param AllottedGeometry 分配的几何信息
	 * @param MyCullingRect 剔除矩形
	 * @param OutDrawElements 绘制元素列表
	 * @param LayerId 图层ID
	 * @param InWidgetStyle 控件样式
	 * @param bParentEnabled 父控件是否启用
	 * @return 图层ID
	 */
	virtual int32 OnPaint(const FPaintArgs& Args, const FGeometry& AllottedGeometry, const FSlateRect& MyCullingRect, FSlateWindowElementList& OutDrawElements, int32 LayerId, const FWidgetStyle& InWidgetStyle, bool bParentEnabled) const override;
	/**
	 * Tick函数
	 * @param AllottedGeometry 分配的几何信息
	 * @param InCurrentTime 当前时间
	 * @param InDeltaTime 增量时间
	 */
	virtual void Tick(const FGeometry& AllottedGeometry, const double InCurrentTime, const float InDeltaTime) override;
	/**
	 * 计算期望大小
	 * @param LayoutScaleMultiplier 布局缩放乘数
	 * @return 期望大小
	 */
	virtual FVector2D ComputeDesiredSize(float) const override;
	/**
	 * 计算易变性
	 * @return 总是返回true
	 */
	virtual bool ComputeVolatility() const override { return true; }
	//~SWidget 接口结束

private:
	/** 为单个命中标记绘制的标记图像 */
	const FSlateBrush* PerHitMarkerImage = nullptr; //每个命中标记图像

	/** 从区域标签（例如，弱点）到覆盖标记图像的映射 */
	TMap<FGameplayTag, FSlateBrush> PerHitMarkerZoneOverrideImages; //每个命中标记区域覆盖图像

	/** 如果有任何命中，则绘制的标记图像 */
	const FSlateBrush* AnyHitsMarkerImage = nullptr; //任意命中标记图像

	/** 命中标记的不透明度 */
	float HitNotifyOpacity = 0.0f; //命中提示不透明度

	/** 显示命中提示的持续时间（秒）（在此期间会逐渐变为透明） */
	float HitNotifyDuration = 0.4f; //命中提示持续时间

	/** 标记的颜色和不透明度 */
	TAttribute<FSlateColor> ColorAndOpacity; //颜色和不透明度
	bool bColorAndOpacitySet; //颜色和不透明度是否设置

	/** 拥有HUD的玩家上下文 */
	FLocalPlayerContext MyContext; //我的上下文
};